perm filename STORAG[MUS,LCS] blob sn#309802 filedate 1977-10-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	SRATE←25600MAG←512/SRATENCHNS←1
C00005 00003	INSTRUMENT PNV 
C00026 00004
C00029 ENDMK
C⊗;
SRATE←25600;MAG←512/SRATE;NCHNS←1;
ARRAY SINEWAVE(512),F2(512),F4(512),
F3(512),F5(512);
SYNTH(SINEWAVE); 1,1 999;
SEG(F2);1,1 1,90  0,100;
SEG(F3);1,1 1,100;                
SEG(F4);1,1 .6,1.5 .3,5 .15,10 .15,100;           
SEG(F5);0,1 0,30 .07,45 1,60 1,100;
ARRAY D1(1601),D2(1867),D3(2053),D4(2251),D5(347),D6(113),D7(37);
VARIABLE /DSIG;

INSTRUMENT REV;
REV1(DSIG,1601,.802,D1);
REV1(DSIG,1867,.773,D2);
REV1(DSIG,2053,.753,D3);
REV1(DSIG,2251,.753,D4);
REV2(U1+U2+U3+U4,347,.7,D5);
REV2(U5,113,.7,D6);
REV2(U6,37,.7,D7);
DSIG←0;
OUTA←OUTA+U7;         
END;
INSTRUMENT PNV; 
VARIABLE AMPL, DECAYLENGTH, FREQ1, MISTUNE,               
	PEDAL, DURATION, FREQ2, FREQ3, STRETCH1, STRETCH2,
	INDEX1, INDEX2, INDEX3, SCFREQ, ALFREQ, TH1, TH2,
	/DECAY, /AMP, /MOD1, /MOD2, /MOD3, /STR1, /STR2, /STR3,
        /VIBWIDTH, /VIBFREQ, /VIBRATO, /SCFREQ2, /SCFREQ3;

I_ONLY BEGIN
    DURATION ← P2;         			< SET IN SCORE;
    FREQ1 ← P3;   				< SET IN SCORE;
    IF FREQ1 < F/2 THEN FREQ1 ← FREQ1 - 10/FREQ1;      < TUNING
    IF FREQ1 > F*2 THEN FREQ1 ← FREQ1 + FREQ1/170;    < TUNING
    ALFREQ ← ALOG(FREQ1);
    INDEX1 ← 43/(ALFREQ*ALFREQ);     
    INDEX2 ← ALFREQ*ALFREQ/125;       
    INDEX3 ← (225/FREQ1)-.05;       
    IF FREQ1< A/2 THEN BEGIN
      INDEX1 ← 45/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/125;        
      INDEX3 ← (245/FREQ1)-.05;       
      END;
    IF FREQ1< D/2 THEN BEGIN
      INDEX1 ← 71/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/88;        
      INDEX3 ← (245/FREQ1)-.05;       
      END;
    IF FREQ1< B/4 THEN BEGIN
      INDEX1 ← 92/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/80;        
      INDEX3 ← (250/FREQ1)-.05;       
      END;
    IF FREQ1< FS/4 THEN BEGIN
      INDEX1 ← 97/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/54;        
      INDEX3 ← (280/FREQ1)-.05;       
      END;
    IF FREQ1< D/4 THEN BEGIN
      INDEX1 ← 103/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/50;        
      INDEX3 ← (280/FREQ1)-.05;       
      END;
    IF FREQ1< A/8 THEN BEGIN
      INDEX1 ← 110/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/40;        
      INDEX3 ← (300/FREQ1)-.05;       
      END;
    IF FREQ1> AF THEN BEGIN
      INDEX1 ← 28/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/250;        
      INDEX3 ← (150/FREQ1)-.05;       
      END;
    IF FREQ1> D*2 THEN BEGIN
      INDEX1 ← 18/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/400;        
      INDEX3 ← (80/FREQ1)-.05;       
      END;
    IF FREQ1> A*2 THEN BEGIN
      INDEX1 ← 10/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/500;        
      INDEX3 ← (15/FREQ1)-.05;       
      END;
    IF FREQ1> C*4 THEN BEGIN
      INDEX1 ← 6/(ALFREQ*ALFREQ);     
      INDEX2 ← ALFREQ*ALFREQ/700;        
      INDEX3 ← (10/FREQ1)-.05;       
      END;
    IF FREQ1> G*4 THEN
      INDEX3←INDEX2←INDEX1 ← 0;                     
    AMPL ← P4-(P4*INDEX2/FREQ1);		        < SET IN SCORE
    MISTUNE←ALFREQ/90;
    FREQ2 ← FREQ1 + MISTUNE;              
    FREQ3 ← FREQ1 - MISTUNE;
    DECAYLENGTH ← 30/ALFREQ;         
    SCFREQ ← FREQ1 * MAG;
    SCFREQ2 ← FREQ2 * MAG;
    SCFREQ3 ← FREQ3 * MAG;
    PEDAL ← .03; 
    IF FREQ1 > FS * 4 THEN PEDAL ← .05;
    STRETCH1 ← .01+FREQ1/50000;
    STRETCH2 ← .02+FREQ1/40000;           
    TH1 ← 1;
    IF FREQ1 < F/2 THEN TH1 ←0;
    IF FREQ1 < F/2 THEN AMPL←AMPL*3/2;
    TH2 ← 1;
    IF FREQ1 < FS/4 THEN TH2 ←0;
    IF FREQ1 < FS/4 THEN AMPL←AMPL*3/2;  
END;

DECAY ← COSCIL (P4, MAG/P14, P6);  
VIBWIDTH← INTRP(P8*MAG, P9*MAG, F3);
VIBFREQ ← INTRP(P10, P11, F3);
VIBRATO ← OSCIL (VIBWIDTH,MAG/VIBFREQ, SINEWAVE);
MOD1←COSCIL((SCFREQ+VIBRATO)*INDEX1*P13,(SCFREQ+VIBRATO)+STRETCH1,SINEWAVE);	      
MOD2←COSCIL((SCFREQ+VIBRATO)*INDEX2*P13,2*(SCFREQ+VIBRATO)+STRETCH2,SINEWAVE);	 
MOD3←COSCIL((SCFREQ+VIBRATO)*INDEX3*P13,4*(SCFREQ+VIBRATO)+STRETCH2,SINEWAVE);	      
STR1 ←CZOSCIL (DECAY,SCFREQ+VIBRATO+ MOD1 + MOD2 + MOD3, SINEWAVE);	
STR2 ←CZOSCIL(DECAY,(SCFREQ2+VIBRATO+MOD1+MOD2+MOD3)*TH2, SINEWAVE);	
STR3 ←CZOSCIL(DECAY,(SCFREQ3+VIBRATO+MOD1+MOD2+MOD3)*TH1, SINEWAVE);	
DSIG←DSIG+(STR1+STR2+STR3)*PEDAL/3;  
OUTA ← OUTA + (STR1+ STR2 + STR3)/3;           
END;